package com.esd.crm.util;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

//import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Service;

import com.esd.crm.Constants;

/**
 * 工具类: ①将前台传进来的对象或者字段转换成适合sql语句的字段 ②将从数据库读取出来的对象或者字段转换成适合前台显示的对象或字段
 * 
 * @author yufu
 * @email ilxly01@126.com 2014-11-5
 */
@Service
public class KitService {

	// private static Logger logger = Logger.getLogger(KitService.class);
	/**
	 * 生成一个UUID
	 * 
	 * @return
	 */
	public static String getUUID() {
		String uuid = UUID.randomUUID().toString().replace("-", "");
		return uuid;
	}
	
	/**
	 * 获取以UTF-8编码的byte数组
	 * @param str
	 * @return
	 */
	public static byte[] getByte(String str){
		byte[] fileByte = null;
		try {
			fileByte = str.getBytes(Constants.CHARACTER);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return fileByte;
	}
	
	/**
	 * 默认替换选择器内容的方法名称为id
	 * @param cont
	 * @param id
	 * @return
	 */
//	public static String getString(byte[] cont,String id){
//		String content = "";
//		try {
//			content = new String(cont,Constants.CHARACTER);
//		} catch (UnsupportedEncodingException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		if(!StringUtils.isBlank(content)){
//			content = handleContent(id,content);
//		}
//		return content;
//	}
	
	/**
	 * 默认替换选择器内容的方法名称为id
	 * @param id
	 * @param content
	 * @return
	 */
	public static String handleContent(String id,String content){
		String str = content;
		if(content.indexOf("_" + id)< 0){
			if(content.indexOf("=")>-1){
				content = content.substring(content.indexOf("="));
				String strBefor = "var _"+id;
				str = strBefor + content;
			}
		}
		return str;
	}
	
	/**
	 * 根据反射的原理，封装成List<Map>
	 * @author ldw
	 * @param list
	 * @param args
	 * @return
	 */
	public static <T> List<Map<String,Object>> getListMap(List<T> list, String ...args){
		List<Map<String,Object>> returnList = new ArrayList<>();
		if(list.size() <= 0){
			return returnList;
		}
		for (T t: list) {
			Map<String, Object> map = getMap(t, args);
			returnList.add(map);
		}
		return returnList;
	}
	
	/**
	 * 根据反射原理，将对象封装成Map
	 * @author ldw
	 * @param t
	 * @param args
	 * @return
	 */
	public static <T> Map<String, Object> getMap(T t,String ... args){
		if(t == null){
			return null;
		}
		Map<String, Object> map = new HashMap<>();
		Class<?> c = t.getClass();
		try{
			for (String str : args) {
				String methodName = "get" + upperCase(str);
				Method method = c.getMethod(methodName);
				Object obj = method.invoke(t);
				
				if(obj != null && obj.getClass().equals(byte[].class)){
					obj = new String((byte[]) obj,"Utf-8");
				}
				map.put(str, obj);
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return map;
	}
	
	/**
	 * 首字母大写
	 * @author ldw
	 * @param str
	 * @return
	 */
	public static String upperCase(String str) {  
	    return str.substring(0, 1).toUpperCase() + str.substring(1);  
	} 
	
	/**
	 * 组装成适合dao成使用的map参数-供service层的方法使用, 复用
	 * 
	 * @param page
	 *            查询的页码, 默认查询第一页
	 * @param pageSize
	 *            默认为Constants.PAGE_SIZE的值
	 * @param sort
	 *            排序字段 默认为create_time列
	 * @param order
	 *            排序方式 默认为 desc倒序排列
	 * @return
	 */
	/*public static Map<String, Object> getParamMap(Integer page, Integer pageSize, String sort, String order) {
		Map<String, Object> paramMap = new HashMap<String, Object>();
		pageSize = (pageSize == null || pageSize <= 0) ? Constants.PAGE_SIZE : pageSize;
		int startIndex = (page == null || page <= 0) ? (Constants.PAGE - 1) : (page - 1) * pageSize;
		paramMap.put("page", startIndex);
		paramMap.put("pageSize", pageSize);
		paramMap.put("sort", StringUtils.isBlank(sort) ? Constants.SORT : sort);
		paramMap.put("order", StringUtils.isBlank(order) ? Constants.ORDER_DESC : order);
		return paramMap;
	}*/

	/**
	 * 将日期转换为yyyy-MM-dd格式
	 * 
	 * @param date
	 * @return
	 */
	public static String dateForShow(Date date) {
		if (date == null) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(date);
	}

	/**
	 * 解析html 返回图片路径 用于文章保存
	 * 
	 * @param html
	 * @return
	 */
//	public static String parseHTML(String html) {
//		String imagesId = "";
//		if (StringUtils.isBlank(html)) {
//			return "";
//		} else {
//			Document doc = Jsoup.parse(html);
//			Elements elements = doc.select("img");
//			for (int i = 0; i < elements.size(); i++) {
//				int beginIndex = elements.get(i).attr("src").lastIndexOf("/") + 1;
//				if (StringUtils.isBlank(imagesId)) {
//					imagesId = elements.get(i).attr("src").substring(beginIndex);
//				} else {
//					imagesId = imagesId + ";" + elements.get(i).attr("src").substring(beginIndex);
//				}
//			}
//			return imagesId;
//		}
//	}

	/**
	 * 手机号校验
	 * 
	 * @auther yufu
	 * @date 2017年3月23日 下午4:10:37
	 * @email feimeideyanggao@126.com
	 * @param
	 */
	public static boolean mobilePhoneCheck(String mobile) {
		String regExpCellPhone = "^1[3|4|5|8][0-9]\\d{8}$";
		Pattern pattern = Pattern.compile(regExpCellPhone);
		return pattern.matcher(mobile).find();

	}

	/**
	 * 手机号/座机号码校验
	 * 
	 * @author yuguagua
	 * @time 2018年1月19日 下午4:26:38
	 * @email feimeideyanggao@126.com
	 */
	public static boolean telePhoneCheck(String mobile) {
		Pattern p1 = null, p2 = null;
		Matcher m1 = null, m2 = null;
		p1 = Pattern.compile("^(0|86|17951)?(13[0-9]|15[012356789]|17[01678]|18[0-9]|14[57])[0-9]{8}$"); // 验证带区号的
		p2 = Pattern.compile("^(0[0-9]{2,3}\\-)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?$"); // 验证没有区号的
		m1 = p1.matcher(mobile);
		m2 = p2.matcher(mobile);
		if(!m1.matches()&&!m2.matches()){
			return false;
		}
		return true;
	}

	/**
	 * 银行卡校验
	 * 
	 * @auther zhangyanchao
	 * @date 2017年5月26日 下午4:10:37
	 * @email feimeideyanggao@126.com
	 * @param
	 */
	public static boolean paymentMethodCardCheck(String paymentMethodCard) {
		String regExpCellPaymentMethodCard = "^(\\d{16}|\\d{19})$";
		Pattern pattern = Pattern.compile(regExpCellPaymentMethodCard);
		return pattern.matcher(paymentMethodCard).find();

	}
	
	public static String handleAreaCode(String areaCode) {
		if(areaCode.equals("10000000")) {
			areaCode = null;
		}else if(areaCode.startsWith("10")) {
			//省
			areaCode = "30" + areaCode.substring(2, 4) + "____";
		}else if(areaCode.startsWith("20")) {
			//市
			areaCode = "30" + areaCode.substring(2,6) + "__";
		}
		return areaCode;
	}

	public static void main(String[] args) {
		// for(int i=0;i<10;i++){
		// System.out.println(KitService.getUUID());
		// }
		System.out.println(KitService.telePhoneCheck("13812345678"));
	}

}
